/*
 *  Copyright (C) 2010 Fabien Renaud
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.boc.botv.service;

import com.boc.botv.model.Bet;
import com.boc.botv.model.BetChoice;
import com.boc.botv.model.BetInstance;
import com.boc.botv.model.User;
import java.util.Date;
import java.util.List;

/**
 * Gestionnaire de paris
 * @author Fabien Renaud
 */
public interface BetManager {

  /**
   * Retourne un pari en fonction de son identifiant.
   * @param betId l'identifiant du pari
   * @return le pari
   */
  public Bet getBet(int betId);

  /**
   * Retourne la liste des paris.
   * @return la liste des paris
   */
  public List<Bet> getBets();

  /**
   * Retourne la liste des paris dont la date de création est dans un intervalle donné.
   * @param firstDate la date de début de l'intervalle
   * @param lastDate la date de fin de l'intervalle
   * @return la liste des paris
   */
  public List<Bet> getBetsByCreationTime(Date firstDate, Date lastDate);

  /**
   * Retourne la liste des paris dont la date de début est dans un intervalle donné.
   * @param firstDate la date de début de l'intervalle
   * @param lastDate la date de fin de l'intervalle
   * @return la liste des paris
   */
  public List<Bet> getBetsByStartTime(Date firstDate, Date lastDate);

  /**
   * Retourne la liste des paris dont la date de fin est dans un intervalle donné.
   * @param firstDate la date de début de l'intervalle
   * @param lastDate la date de fin de l'intervalle
   * @return la liste des paris
   */
  public List<Bet> getBetsByEndTime(Date firstDate, Date lastDate);

  /**
   * Retourne la liste des paris n'ayant pas été joués pendant un intervalle donné.
   * @param firstDate date de début de l'intervalle
   * @param lastDate date de fin de l'intervalle
   * @return la liste des paris
   */
  public List<Bet> getBetsPlayedBetween(Date firstDate, Date lastDate);

  /**
   * Retourne la liste des paris ayant été joués pendant un intervalle donné.
   * @param firstDate date de début de l'intervalle
   * @param lastDate date de fin de l'intervalle
   * @return la liste des paris
   */
  public List<Bet> getBetsNotPlayedBetween(Date firstDate, Date lastDate);

  /**
   * Retourne la liste des choix possibles associés à un pari.
   * @param betId l'identifiant du pari
   * @return la liste des choix associés
   */
  public List<BetChoice> getChoices(int betId);

  /**
   * Retourne la liste des instances de paris effectuées pour un pari donné
   * @param betId  l'identifiant du pari
   * @return la liste des instances de pari associées
   */
  public List<BetInstance> getGamesByBet(int betId);

  /**
   * Retourne la liste des instances de paris effectuées pour un pari et un choix données
   * @param choiceId l'identifiant du choix du pari
   * @return la liste des instances de pari associées
   */
  public List<BetInstance> getGamesByChoice(int choiceId);

  /**
   * Crée un pari.
   * @param bet le pari à créer.
   */
  public void createBet(Bet bet);

  /**
   * Met à jour un pari.
   * @param bet le pari à mettre à jour
   */
  public void updateBet(Bet bet);

  /**
   * Supprime un pari.
   * @param bet le pari à supprimer
   */
  public void deleteBet(Bet bet);

  /**
   * Modifie le nom d'un pari.
   * @param betId L'id du pari
   * @param name Le nouveau nom du pari.
   * @return true si le nom a bien été modifiée
   */
  public boolean changeName(int betId, String name);

  /**
   * Modifie la description du pari
   * @param betId L'id du pari
   * @param description la nouvelle description du pari.
   * @return true si la description a bien été modifiée
   */
  public boolean changeDescription(int betId, String description);

  /**
   * Ajoute un choix à un pari.
   * @param bet le pari auquel ajouter le choix.
   * @param label le choix pour le pari.
   * @return true si le choix a bien été ajouté.
   */
  public boolean addChoice(Bet bet, String label);

  /**
   * Change le label d'un choix.
   * @param choiceId l'identifiant du choix à modifier.
   * @param label le nouveau label du choix.
   * @return true si le choix a bien été modifié.
   */
  public boolean changeChoice(int choiceId, String label);

  /**
   * Supprime un choix d'un pari.
   * @param choiceId l'identifiant du choix à supprimer.
   * @return true si le choix a bien été supprimé.
   */
  public boolean deleteChoice(int choiceId);

  /**
   * Ajoute un joueur à un pari pour un montant donné, montant qui est immédiatement retiré du compte du joueur.
   * @param userId l'identifiant de l'utilisateur qui fait le pari.
   * @param choiceId l'identifiant du choix sur lequel l'utilisateur parie.
   * @param amount la mise du joueur pour le pari concerné.
   * @return true si le joueur a bien été ajouté au pari.
   */
  public boolean addGamer(int userId, int choiceId, double amount);

  /**
   * Définit le choix gagnant d'un pari.
   * Met à jour toutes les instances de paris et crédite/débite tous les comptes des joueurs.
   * @param choiceId l'identifiant du choix gagnant associé au pari.
   * @return true si le choix gagnant a bien été défini et si toutes les opérations ont bien été effectuées.
   */
  public boolean setWinningChoice(int choiceId);

  /**
   * Récupère tous les joueurs ayant gagné un pari donné.
   * @param betId l'identificateur du pari
   * @return la listes des joueurs gagnants à ce pari
   */
  public List<User> getWinners(int betId);

  /**
   * Récupère tous les joueurs ayant perdu un pari donné.
   * @param betId l'identificateur du pari
   * @return la listes des joueurs perdants à ce pari
   */
  public List<User> getLosers(int betId);

  /**
   *
   * @param subsection
   * @return
   */
  public List<Bet> getBetBySubsection(int subsection);

  /**
   *
   * @param subsection
   * @return
   */
  public List<Bet> getCurrentBetsBySubsection(int subsection);

  /**
   * 
   * @param numberOfBet
   * @param subsection
   * @return
   */
  public List<Bet> getBetsByCloserEndDate(int numberOfBet, int subsection);

  /**
   * Permet d'ajouter ou de mettre-à-jour un pari
   * @param admin le User créateur du pari
   * @param name le nom du pari
   * @param desc la description du pari
   * @param creationDate la date de création du pari
   * @param startDate le date de début du pari
   * @param endDate la date de fin du pari
   * @param section la section
   * @param actif son status
   * @return
   */
  public boolean saveOrUpdate(User admin, int id,String name, String desc, Date creationDate, Date startDate, Date endDate, int section, boolean actif);
}

